Skip to main content

1. 使用底层API构建图

Written: 2026.06

2. 图结构对象创建与使用

2.1 图结构概念

LangGraph 图结构示意图

LangGraph 图结构示意图

2.2 节点(Nodes)

任何可执行的功能包括大语言模型API,工具,甚至Agent都可以作为LangGraph图的点

2.3 边(Edges)

边通常负责传递数据,也有一些边负责进行逻辑控制,例如if-else的判断和选择,从而让整个图状结构更加丰富

2.4 State(状态)

LangGraph通过组合点和边去创建复杂的循环工作流程,节点产生的消息通过边传递给别的节点从而形成通路。为了维持节点和边之间的消息传递,LangGraph势必要对所有的消息进行统一管理,这就引出了概念“State(状态)” 在LangGraph构建的流程中,每次执行都会启动一个状态,图中的节点在处理时会传递和修改该状态。这个状态不仅仅是一组静态数据,而是由每个节点的输出动态更新,然后影响循环内的后续操作,确保图通路顺畅

2.5 手动创建图流程

我们先在不接入大模型的情况下构建一个加减法图工作流,我们这里自定义两个简单函数:一个是加法函数接收当前State并将其中的x值加1,另一个是减法函数接收当前State并将其中的x值减2,然后添加名为additionsubtraction的节点,并关联到两个函数上,最后构建出节点之间的边
手动创建图流程示例
图结构可视化示例
除了控制台打印流程图外,也可以生成更加美观的Mermaid 代码,通过processon 编辑器查看
图结构可视化示例
使用processon 编辑器查看
LangGraph 图结构示意图

LangGraph 图结构示意图

2.6 图对象运行

当我们通过builder.compile()方法编译图后,编译后的graph对象提供了invoke方法,该方法用于启动图的执行。在图执行前我们需要通过invoke方法传递一个初始状态,这个状态作为图执行的起始输入:
图对象运行示例
执行结果如下

3. 借助Pydantic构建稳定的State

以上的写法虽然灵活但有一个致命缺陷,我们的State状态缺乏预定义的模式,节点可以在没有严格类型约束的情况下自由地读取和写入状态,这样的灵活性虽然有利于动态数据处理,但这也要求开发者在整个图的执行过程中保持对键和值的一致性管理(例如我们在加减法函数中返回的都是只包含键值对x的字典对象)。因为在任何节点中尝试访问State中不存在的键,会直接中断整个图的运行状态

3.1 Pydantic基本使用

通过集成pydantic中的BaseModel抽象类来定义状态State, 定义后的状态可以对键值对属性进行自动校验,我们编写如下代码,对 a 和 b 键定义不同的类型,错误的类型会报错
Pydantic 基本使用示例
执行结果如下

3.2 Pydantic应用于StateGraph

使用Pydantic对代码进行修改,采用如下方法编写的代码可以对状态键内容和属性进行约束,代码健壮性更强
Pydantic 状态图示例
执行结果如下
需要注意的是在调用大模型过程中, LangGraph 的内部机制是直接操作字典,不调用模型的构造函数。 如果继续用 BaseModel,LangGraph 不会知道如何合并、序列化这些字段,因此在调用大模型过程中,要设置为 TypedDict

4. 流程控制语句

4.1 条件判断

使用langgraph构建了一个状态图,根据输入数值的奇偶性执行不同节点。check_x接收并传递状态,is_even判断奇偶,handle_even和handle_odd分别处理偶数和奇数情况,最终输出结果
LangGraph 图结构示意图

LangGraph 图结构示意图

条件判断示例
执行结果如下

4.2 循环语句

定义了一个基于循环流程,通过increment节点不断将状态中的x值加1,直到is_done条件判断x > 10成立时停止。初始x=6,每次执行increment节点更新状态,最终输出x=11
LangGraph 图结构示意图

LangGraph 图结构示意图

循环语句示例
执行结果如下

4.3 判断循环复合图

定义了一个基于状态图的流程控制系统。通过判断数值 x 的奇偶性,决定执行递增或结束流程。使用 langgraph 构建状态机,check_x 节点检查 x 值,is_even 判断分支,偶数时递增后循环回检查节点,奇数时结束流程
LangGraph 图结构示意图

LangGraph 图结构示意图

判断循环复合图示例
执行结果如下
LangGraph 会把所有节点名、状态字段、通道名放在一个命名空间中处理,为了避免歧义,它会严格检查有没有冲突,最保险的做法是:节点名不要与字段名重复,既如果使用 state.result =“done”,也不要有“result”这个节点

5. 子图

在LangGraph中,一个Graph除了可以单独使用,还可以作为一个Node,嵌入到一个Graph中。这种用法就称为子图。通过子图,我们可以更好的重用Graph,构建更复杂的工作流。尤其在构建多Agent系统时非常有用。在大型项目中,通常都是由一个团队专门开发Agent,再通过其他团队来完成Agent整合 使用子图时,基本和使用Node没有太多的区别。唯一需要注意的是,当触发了SubGraph代表的Node后,实际上是相当于重新调用了一次subgraph.invoke(state)方法 接下来我们定义一个子图节点处理函数 sub_node,它接收一个状态对象并返回包含子图响应消息的新状态。该函数被集成到一个使用 langgraph 构建的图结构中,最终执行图并输出结果
子图示例
执行结果如下

6. Human In Loop 人在环中

6.1 概念介绍

在LangGraph 是个“有状态图(state graph)”的工作流框架,每个节点可以是:
  • 模型调用(LLM、工具调用)
  • 程序逻辑
  • 人类反馈(HITL)
HITL 就是把“人类操作”当作图里的一个节点(step),在运行时需要停下来等待人类确认、输入或决策,然后再继续执行

6.2 典型场景

  1. 确认操作:比如智能体打算删除数据或执行危险操作 → 先让人确认(Yes/No)
  2. 信息补充:模型缺少必要参数时,提示人类补全,比如填写 API Key、选择文件
  3. 审核 / 修改:模型生成的回答需要人审查、修改,再提交给用户
  4. 主动决策分支:工作流里分叉走向不确定 → 由人来选择接下来走哪条分支

6.3 实现要点

  1. 必须指定一个checkpoint短期记忆,否则无法保存任务状态
  2. 在执行Graph任务时,必须指定一个带有thread_id的配置项,指定线程ID。之后才能通过线程ID,指定恢复线程
  3. 在任务执行过程中,通过interrupt()方法,中断任务,等待确认
  4. 在人类确认之后,使用Graph提交一个resume=True的Command指令,恢复任务,并继续进行

6.4 示例代码

示例代码

7. Time Travel 时间回溯

7.1 概念介绍

在 LangGraph 中,Time Travel 是一个允许你“回到对话的某个历史状态点,并从那里重新执行”的功能 它依赖 Checkpointer(检查点系统),比如 MemorySaver、数据库持久化 saver 等,把每一步执行的 状态(state) 保存下来 可以类比成:
  • 普通对话:只能按顺序走下去
  • 有时间回溯:可以跳到某一步(比如第 3 次工具调用前),从那个状态继续,甚至尝试不同的分支

7.2 使用场景

  • 调试:想看 agent 在某个历史状态下会如何响应
  • 修复:发现某一步错误,可以回到那一步,重新走另一条路径
  • 探索分支:从同一个历史状态,分叉出多个可能的结果,做 what-if 实验
  • 人类在环 (HITL):如果用户拒绝了工具调用,可以退回到之前状态,重新走对话

7.3 实现要点

  • 在运行 Graph 时,需要提供初始的输入消息
  • 运行时,指定 thread_id 线程 ID。并且要基于这个线程 ID,再指定一个 checkpoint 检查点。执行后将在每一个 Node 执行后,生成一个 check_point_id
  • 指定 thread_id 和 check_point_id,进行任务重演。重演前,可以选择更新 state,当然,如果没问题,也可以不指定

8. 综合实践

终极目标是使用LangGraph 底层 API 复现高级API create_react_agent 预构建ReACT图 实现一个带人工审核的AI助手工作流。主要功能包括:
  • 调用模型:call_model 函数使用绑定工具的语言模型生成回复
  • 人工审核:human_review 函数在执行工具前请求用户确认,若拒绝则终止流程
  • 工具执行:通过 ToolNode 执行如天气查询等工具调用
  • 状态管理:利用 StateGraph 构建节点流程,支持对话状态保存与恢复
整体流程如下:
LangGraph 图结构示意图

LangGraph 图结构示意图

8.1 最简单的聊天机器人

我们先定义一个基于本地大语言模型的聊天机器人。chatbot 函数接收当前对话状态,调用 llm.invoke() 生成回复,并返回新消息。整体通过 StateGraph 构建工作流,实现从开始到结束的自动对话处理
聊天机器人示例
执行结果如下
整体流程如下
LangGraph 图结构示意图

LangGraph 图结构示意图

8.2 添加提示词与工具

定义工具函数
提示词与工具示例
agent 代码如下
加载环境变量配置
执行结果如下
此时项目图结构为
LangGraph 图结构示意图

LangGraph 图结构示意图

8.3 添加 HITL 环节

HITL 示例
代码执行结果如下
执行结果如下

8.4 添加时间回溯

时间回溯示例
执行结果如下

1. 使用底层API实现ReACT智能体